#include "float2bin.h"
#include "MISC.h"

/*
num是要展示的float数,bin是保存所有二进制位的数组
*/
void getFloatBin_Str( float num,char bin_str[] ){
    int t = 1; //用来按位与操作
    int *f = (int*)(&num); //将float的解释成int，即float的地址转成int*

    // 注意：计算机一般采用小端
    // 从最高位开始按位与，如果为1，则bin[i]=1，如果为0，则bin[i]=0
    // 这里没有将bin存成字符，而是数字1 0
    int i;
    for( i=0; i<32; i++ ){
        bin_str[i] = (*f) & ( t << (31-i) ) ? 1 : 0;
    }
}

void getFloatBin_uint32( float num, uint32_t *bin ){

    int t = 1;
    int *f = (int*)(&num); //将float的解释成int，即float的地址转成int*

#if defined(_DEBUG_FLOAT2BIN_)
    int bits[32] = {0};
#endif
    int i, bit_flag;
    for( i=0; i<32; i++ ){

        bit_flag = (*f) & ( t << (31-i) ) ? 1 : 0;
        
        if( bit_flag == 1 ){
            setbit(*bin, (31-i)); // 注意这里要设置的bit位置

#if defined(_DEBUG_FLOAT2BIN_)
            bits[i] = 1;
#endif
        }
        else{
            clrbit(*bin, (31-i)); // 注意这里要设置的bit位置
            
#if defined(_DEBUG_FLOAT2BIN_)
            bits[i] = 0;
#endif
        }
    }

#if defined(_DEBUG_FLOAT2BIN_)
    printf("#debug:\n");
    printf("num = %f\n", num);
    for( i=0; i<32; i++ ){
        
        if( (i>0) && (i%4==0) )
            printf("_");

        printf("%d", bits[i]);

        if( i==31 )
            printf("\n");
    }
#endif
}


void print_Float_as_Bin( float num ){
    
    char c[32];
    getFloatBin_Str( num, c );
    
    // printf("Float  : %f\n", num_f);
    // printf("Binary : ");

    // 采用IEEE-754标准的方式输出
    for(int i=0; i<32; i++){
        printf("%d",c[i]);
        if(i==0)
            printf("_");
        if(i==8)
            printf("_");
            
        if(i==31)
            printf("\n");
    }
}
